package controllers

import (
	"gitee.com/zjlsliupei/ghelp"
	"gitee.com/zjlsliupei/gweb"
	"github.com/beego/beego/v2/core/logs"
	"github.com/gin-gonic/gin"
	"github.com/gookit/validate"
	"skeleton/models"
	"skeleton/utils"
)

func DemoAdd(c *gin.Context) {
	// 参数获取
	demoModel := models.Demo{}
	err := c.ShouldBind(&demoModel)
	if err != nil {
		gweb.Json(c, gweb.JsonFailCode, err.Error(), nil)
		return
	}
	// 参数验证
	v := validate.Struct(&demoModel).WithScenarios(demoModel.GetScene())
	if !v.Validate("add") {
		gweb.Json(c, gweb.JsonFailCode, v.Errors.One(), nil)
		return
	}
	// 数据库操作
	res := gweb.GetDB().Create(&demoModel)
	if res.Error != nil {
		logs.Error("DemoAdd err:", res.Error.Error())
		gweb.Json(c, gweb.JsonFailCode, "新增失败", nil)
		return
	}
	// todo : 其它业务处理
	gweb.Json(c, gweb.JsonSuccessCode, "success", ghelp.MAP{
		"id": demoModel.ID,
	})
}

func DemoUpdate(c *gin.Context) {
	// 参数获取
	demoModel := models.Demo{}
	err := c.ShouldBind(&demoModel)
	if err != nil {
		gweb.Json(c, gweb.JsonFailCode, err.Error(), nil)
		return
	}
	// 参数验证
	v := validate.Struct(&demoModel).WithScenarios(demoModel.GetScene())
	if !v.Validate("update") {
		gweb.Json(c, gweb.JsonFailCode, v.Errors.One(), nil)
		return
	}
	// 数据库操作
	res := gweb.GetDB().Omit("created_at", "deleted_at").Save(&demoModel)
	if res.Error != nil {
		logs.Error("DemoAdd err:", res.Error.Error())
		gweb.Json(c, gweb.JsonFailCode, "修改失败", nil)
		return
	}
	// todo : 其它业务处理
	gweb.Json(c, gweb.JsonSuccessCode, "success", nil)
}

func DemoDel(c *gin.Context) {
	// 参数获取
	demoModel := models.Demo{}
	err := c.ShouldBind(&demoModel)
	if err != nil {
		gweb.Json(c, gweb.JsonFailCode, err.Error(), nil)
		return
	}
	// 参数验证
	v := validate.Struct(&demoModel).WithScenarios(demoModel.GetScene())
	if !v.Validate("del") {
		gweb.Json(c, gweb.JsonFailCode, v.Errors.One(), nil)
		return
	}
	// 数据库操作
	res := gweb.GetDB().Delete(&demoModel)
	if res.Error != nil {
		logs.Error("DemoDel err:", res.Error.Error())
		gweb.Json(c, gweb.JsonFailCode, "删除失败", nil)
		return
	}
	// todo : 其它业务处理
	gweb.Json(c, gweb.JsonSuccessCode, "success", nil)
}

func DemoGet(c *gin.Context) {
	// 参数获取
	demoModel := models.Demo{}
	err := c.ShouldBind(&demoModel)
	if err != nil {
		gweb.Json(c, gweb.JsonFailCode, err.Error(), nil)
		return
	}
	// 参数验证
	v := validate.Struct(&demoModel).WithScenarios(demoModel.GetScene())
	if !v.Validate("get") {
		gweb.Json(c, gweb.JsonFailCode, v.Errors.One(), nil)
		return
	}
	// 数据库操作
	res := gweb.GetDB().Find(&demoModel)
	if res.Error != nil {
		logs.Error("DemoGet err:", res.Error.Error())
		gweb.Json(c, gweb.JsonFailCode, "获取失败", nil)
		return
	}
	if res.RowsAffected == 0 {
		logs.Error("DemoGet id:%d not found:", demoModel.ID)
		gweb.Json(c, gweb.JsonFailCode, "查无记录", nil)
		return
	}

	// todo : 其它业务处理
	gweb.Json(c, gweb.JsonSuccessCode, "success", ghelp.MAP{
		"info": demoModel,
	})
}

func DemoList(c *gin.Context) {
	// 参数获取
	paramList := utils.ParamList{}
	err := c.ShouldBind(&paramList)
	if err != nil {
		gweb.Json(c, gweb.JsonFailCode, err.Error(), nil)
		return
	}
	// 参数验证
	v := validate.Struct(&paramList)
	if !v.Validate("get") {
		gweb.Json(c, gweb.JsonFailCode, v.Errors.One(), nil)
		return
	}
	// 数据库操作
	var total int64
	var list []models.Demo
	res := gweb.GetDB().
		Offset((paramList.Page - 1) * paramList.PageSize).
		Limit(paramList.PageSize).
		Order("id desc").
		Find(&list).
		Offset(-1).
		Limit(-1).
		Count(&total)
	if res.Error != nil {
		logs.Error("DemoList err:", res.Error.Error())
		gweb.Json(c, gweb.JsonFailCode, "获取失败", nil)
		return
	}

	// todo : 其它业务处理
	gweb.Json(c, gweb.JsonSuccessCode, "success", ghelp.MAP{
		"list":  list,
		"total": total,
	})
}
